package net.dgg.zz.common.files.service;

import cn.dgg188.ossservice.entity.DggMFileItem;
import cn.dgg188.ossservice.service.DggOSSService;
import com.mongodb.WriteResult;
import net.dgg.framework.tac.mongo.utils.DggMongoUtils;
import net.dgg.iboss.base.common.exception.BizException;
import net.dgg.iboss.base.util.StringUtils;
import net.dgg.tmd.foundation.platform.session.SessionManager;
import net.dgg.tmd.foundation.platform.user.entity.UserEntity;
import net.dgg.zz.common.files.entity.Annex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @Author:HDC
 * @Date: Created in 2018/8/15 17:27
 * @Copyright © dgg group.All Rights Reserved. 版权信息
 */
@Service
public class AnnexService {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    DggOSSService ossService;
    @Autowired
    private SessionManager sessionManager;

    /**
     * MultipartFile文件上传
     *
     * @param fileId 自定义文件ID：表名+字段名+业务数据ID，如orf_order-fild-111545
     * @param file   MultipartFile文件
     * @return
     */
    public Annex saveMultipartFile(String fileId, MultipartFile file) {
        Annex fsl = null;
        InputStream fs = null;
        ByteArrayOutputStream bos = null;
        try {
            if (StringUtils.isBlank(fileId)) {
                throw new BizException("自定义文件ID不能为空", 10009);
            }
            if (null == file) {
                throw new BizException("文件不能为空", 10009);
            }
            //转byte[]
            byte[] buffer = null;
            fs = file.getInputStream();
            bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int n;
            while ((n = fs.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            buffer = bos.toByteArray();
            //-------------文件上传------------------------------------------
            //文件id,文件对象,文件名,文件扩展名
            //获取文件名
            String fileName = file.getOriginalFilename();
            if (null == buffer || buffer.length <= 0) {
                throw new BizException("文件没有内容，请重新上传", 10009);
            }
            Annex annex = this.findFile(fileId, fileName);
            if (null != annex) {
                throw new BizException("文件已存在，请重新上传", 10009);
            }
            fsl = this.saveFile(fileId, buffer, fileName);
        } catch (IOException e) {
            throw new BizException("文件上传异常", 10009);
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fs != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return fsl;
    }

    /**
     * 文件流上传
     *
     * @param fileId   自定义文件ID：表名+字段名+业务数据ID，如orf_order-fild-111545
     * @param buffer   文件流
     * @param fileName 文件名带后缀
     * @return
     */
    public Annex saveFile(String fileId, byte[] buffer, String fileName) throws BizException {
        Annex fsl = null;
        // 获取文件扩展名
        String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
        fsl = this.saveFiles(fileId, buffer, fileName, ext);
        System.out.println("文件路径:" + fsl.getFilepath() + "   文件id:" + fsl.getFileid() + "   文件名:" + fsl.getFilename() + "   文件上传时间:" + fsl.getFiledate());
        return fsl;
    }

    /**
     * 根据文件ID查询文件信息   用“-”分割，便于表名+字段名+业务数据ID，如orf_order-fild-111545
     *
     * @param fileId 文件ID
     * @return
     */
    public List<Annex> findFile(String fileId) {
        return null != fileId ? DggMongoUtils.getMongoTemplate().find(new Query(Criteria.where("fileid").is(fileId)), Annex.class) : null;
    }

    /**
     * 根据fileId和fileName查询对应文件
     *
     * @param fileId   文件自定义Id
     * @param fileName 文件名称
     * @return
     */
    public Annex findFile(String fileId, String fileName) {
        return null != fileId && null != fileName ? DggMongoUtils.getMongoTemplate().findOne(new Query(Criteria.where("fileid").is(fileId).and("filename").is(fileName)), Annex.class) : null;
    }

    /**
     * 根据fileId和fileName删除对应文件
     *
     * @param fileId   文件ID
     * @param fileName 文件名称
     * @return
     */
    public Boolean delFile(String fileId, String fileName) {
        WriteResult wrs = DggMongoUtils.getMongoTemplate().remove(new Query(Criteria.where("fileid").is(fileId).and("filename").is(fileName)), Annex.class);
        if (wrs.getN() > 0) {
            return true;
        }
        return false;
    }

    /**
     * 修改附件查看和下载次数
     *
     * @param id       附件id
     * @param type     类型
     * @param fileName 文件名称
     */
    public void updateFile(String id, String type, String fileName) {
        Update update = new Update();
        Annex annex = DggMongoUtils.getMongoTemplate().findOne(new Query(Criteria.where("fileid").is(id).and("filename").is(fileName)), Annex.class);
        if(StringUtils.isNotBlankObj(annex)){
            if ("view".equals(type)) {
                update = Update.update("viewCount", annex.getViewCount() + 1);
            } else if ("down".equals(type)) {
                update = Update.update("downCount", annex.getDownCount() + 1);
            }
            DggMongoUtils.getMongoTemplate().updateFirst(new Query(Criteria.where("fileid").is(id).and("filename").is(fileName)), update, Annex.class);
        }
    }

    /**
     * 根据文件名前缀匹配文件
     *
     * @param prefix 前缀
     * @return
     */
    public List<Annex> findFiles(String prefix) {
        Criteria criteria = Criteria.where("fileid").regex("^" + prefix + "(-.*$|_.*$)");
        return null != criteria ? DggMongoUtils.getMongoTemplate().find(new Query(criteria), Annex.class) : null;
    }

    /**
     * 上传文件并保存到mongo
     *
     * @param fileid       文件id
     * @param filedocument 文件流
     * @param filename     文件名称
     * @param fileext      文件扩展名
     * @return
     */
    public Annex saveFiles(String fileid, byte[] filedocument, String filename, String fileext) {
        if (null != fileid && null != filedocument && filedocument.length > 0 && null != filename && null != fileext) {
            DggMFileItem dggMFileItem = ossService.upload(fileid,filedocument, filename, fileext);
            if (null != dggMFileItem.getFilepath()) {
                Annex annex = new Annex();
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String stae = formatter.format(new Date());
                annex.setFileid(fileid);
                annex.setFiledate(stae);
                annex.setFilename(filename);
                annex.setFilepath(dggMFileItem.getFilepath());
                UserEntity userEntity = sessionManager.getCurrentUser();
                if(userEntity!=null){
                    annex.setCreateUser(userEntity.getRealName()+userEntity.getLoginName());
                }
                return annex;
            }
        }
        return null;
    }

    /**
     * 关联历史文件数据到MongoDB
     * @param fileid 文件自定义id
     * @param fileName 文件名称
     */
    public void saveOldFiles(String fileid,String fileName){
        String filePath = "group2/M00/zzsc/"+fileName;
        Annex annex = new Annex();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String stae = formatter.format(new Date());
        annex.setFileid(fileid);
        annex.setFiledate(stae);
        annex.setFilename(fileName);
        annex.setFilepath(filePath);
        DggMongoUtils.getMongoTemplate().save(annex);
    }
}
